package motor.estado;

import java.io.IOException;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;


import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import static motor.estado.Tablero.*;

public final class ImportadorXML {
	private static Document _dom;
	// El constructor es privado para que no lo puedan usar otras clases.
	private ImportadorXML() {
		throw new AssertionError("No se permite crear ejemplares de esta clase.");	
	}
	
	public static void ImportaDatos(String rutaFichero, ArrayList<Lugar> l) {
		
		parseaArchivoXml(rutaFichero);
        parseaDocumento(l);
	}
	
	private static void parseaArchivoXml(String rutaFichero)  {
        	DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			try {
				DocumentBuilder db = dbf.newDocumentBuilder();
				try {
					_dom = db.parse(rutaFichero);
				} catch (SAXException | IOException e) {
					e.printStackTrace();
				} 
			} catch (ParserConfigurationException e1) {
				e1.printStackTrace();
			}
            
    }
    private static void parseaDocumento(ArrayList<Lugar> l){
        Element docEle = _dom.getDocumentElement();
        NodeList nl = docEle.getElementsByTagName("Lugar");
        if(nl != null && nl.getLength()>0) {
            for (Integer i=0; i < nl.getLength(); i++) {
                Element elemento = (Element) nl.item(i);
                Lugar elem = obtenerItem(elemento);
                l.add(elem);
            }
            for (Integer i=0; i< nl.getLength();i++) {
            	Element elemento = (Element) nl.item(i);
            	obtenerAdyacentes(elemento);
            }
        }
    }
    
    private static void obtenerAdyacentes(Element elemento) {
    	
    	Lugar l=getLugarporNombre(elemento.getAttribute("_nombre"));
    	if (obtenerTexto(elemento, "_adyNorte")!=null) {
    		l.addVecino(getLugarporNombre(obtenerTexto(elemento, "_adyNorte")));
    	}
    	if (obtenerTexto(elemento, "_adyEste")!=null) {
    		l.addVecino(getLugarporNombre(obtenerTexto(elemento, "_adyEste")));
    	}
    	if (obtenerTexto(elemento, "_adySur")!=null) {
    		l.addVecino(getLugarporNombre(obtenerTexto(elemento, "_adySur")));
    	}
    	if (obtenerTexto(elemento, "_adyOeste")!=null) {
    		l.addVecino(getLugarporNombre(obtenerTexto(elemento, "_adyOeste")));
    	}
    	if (obtenerTexto(elemento, "_adyNoreste")!=null) {
    		l.addVecino(getLugarporNombre(obtenerTexto(elemento, "_adyNoreste")));
    	}
    	if (obtenerTexto(elemento, "_adyNoroeste")!=null) {
    		l.addVecino(getLugarporNombre(obtenerTexto(elemento, "_adyNoroeste")));
    	}
    	if (obtenerTexto(elemento, "_adySureste")!=null) {
    		l.addVecino(getLugarporNombre(obtenerTexto(elemento, "_adySureste")));
    	}
    	if (obtenerTexto(elemento, "_adySuroeste")!=null) {
    		l.addVecino(getLugarporNombre(obtenerTexto(elemento, "_adySuroeste")));
    	}    	
    }
    
    private static Lugar obtenerItem(Element elemento) {
        Lugar l=new Lugar(elemento.getAttribute("_nombre"));
        return l;
    }
    
    private static String obtenerTexto(Element elemento, String Etiqueta) {
        String texto=null;
        NodeList nl = elemento.getElementsByTagName(Etiqueta);
        if(nl != null && nl.getLength() > 0) {
            Element el = (Element) nl.item(0);
            texto = el.getFirstChild().getNodeValue();
        }
        return texto;
    }
    private Integer obtenerEntero(Element elemento, String Etiqueta) {
        Integer num=null;
        NodeList nl = elemento.getElementsByTagName(Etiqueta);
        if(nl != null && nl.getLength() > 0) {
            Element el = (Element) nl.item(0);
            num = Integer.parseInt(el.getFirstChild().getNodeValue());
        }
        return num;
    }

}
